package com.youlv.yl.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.youlv.yl.dao.CartItemDao;
import com.youlv.yl.dto.CartDto;
import com.youlv.yl.dto.CartNumDto;
import com.youlv.yl.entity.hotel.Cart;
import com.youlv.yl.dao.CartDao;
import com.youlv.yl.entity.hotel.CartItem;
import com.youlv.yl.service.intf.CartService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.youlv.yl.util.StringUtils;
import com.youlv.yl.util.TokenUtils;
import com.youlv.yl.vo.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author fenghe
 * @since 2022-01-17
 */
@Service
public class CartServiceImpl extends ServiceImpl<CartDao, Cart> implements CartService {
    @Autowired
    private CartDao dao;
    @Autowired
    private CartItemDao itemDao;

    @Override
    public R save(CartDto dto) {
        // 入参校验
        if(dto != null && StringUtils.isNotEmpty(dto.getToken()) && dto.getNum() > 0) {
            // 通过token查询用户id
            Long uid = TokenUtils.getUidByToken(dto.getToken());
            // 通过用户id查询当前用户购物车
            QueryWrapper<Cart> queryWrapper = new QueryWrapper<>();
            queryWrapper.eq("uid", uid);
            Cart cart = dao.selectOne(queryWrapper);
            if(cart == null) {
                // 若当前用户无购物车，则创建购物车
                cart = new Cart();
                cart.setUid(uid);
                cart.setCtime(new Date());
                dao.insert(cart);
            }
            // 获取当前用户购物车id
            Long cid = cart.getId();
            // 查询购物车详情
            CartItem item = itemDao.selectByCid(cid, dto.getGid());
            if(item == null) {
                // 第一次添加购物车，新增
                item = new CartItem();
                item.setCid(cid);
                item.setGid(dto.getGid());
                item.setNum(dto.getNum());
                item.setJoinPrice(dto.getPrice());
                item.setCtime(new Date());
                // 添加到数据库
                itemDao.insert(item);
            } else {
                // 购物车已经存在，修改数量
                int num = item.getNum() + dto.getNum();
                if(num > 0) {
                    // 之前加入过本次修改
                    itemDao.updateNum(num, item.getId());
                } else {
                    return R.fail("亲，数量超出！");
                }
            }
            return R.ok();
        }
        return R.fail("请检查参数信息！");
    }

    @Override
    public R change(CartNumDto dto) {
        // 入参校验
        System.err.println(dto);
        if(dto != null && dto.getId() > 0 && dto.getNum() > 0) {
            // 更改数量
            if(itemDao.updateNum(dto.getNum(), dto.getId()) > 0) {
                // 修改成功
                return R.ok();
            }
        }
        return R.fail("请检查参数信息");
    }

    @Override
    public R del(Long id) {
        if(id > 0) {
            if(itemDao.deleteById(id) > 0) {
                return R.ok();
            }
        }
        return R.fail("请检查参数信息");
    }

    @Override
    public R queryMy(String token) {
        if(StringUtils.isNotEmpty(token)) {
            return R.ok(dao.selectMy(TokenUtils.getUidByToken(token)));
        }
        return R.fail("请检查参数信息！");
    }

    @Override
    public R queryIds(int[] ids) {
        if(ids != null && ids.length > 0){
            return R.ok(itemDao.selectByIds(ids));
        }
        return R.fail("请检查参数信息！");
    }
}
